﻿// MyLogger.h (内部头文件)
#ifndef MYLOGGER_H
#define MYLOGGER_H

// --- DLL 导出/导入宏 ---
// 在 MyLogger.cpp 中定义 MYLOGGER_EXPORTS 来导出
#ifdef MYLOGGER_EXPORTS
#define MYLOGGER_API __declspec(dllexport)
#else
#define MYLOGGER_API __declspec(dllimport)
#endif

// --- 标准库包含 ---
#include <string>
#include <memory> // For std::unique_ptr

// --- Qt 类前向声明 (如果启用 Qt) ---
#ifdef QT_CORE_LIB
class QTextBrowser;
class QTextEdit;
// 包含 Qt 头文件，因为 MyLogger 类的方法签名需要它们
#include <QString>   // 某些 Qt 功能可能隐式需要
#include <QtGlobal>  // Qt 全局定义和宏
#endif

// --- 日志级别枚举 ---
// 定义日志消息的严重性级别
enum class LogLevel {
	Trace,    // 非常详细的诊断信息
	Debug,    // 用于调试的信息
	Info,     // 一般操作信息
	Warn,     // 潜在问题或异常情况
	Error,    // 阻止特定操作但不会导致应用程序失败的错误
	Critical, // 导致应用程序失败的严重错误
	Off       // 关闭日志记录
};

// --- Pimpl 实现类前向声明 ---
// 隐藏实现细节
class MyLoggerImpl;

// --- MyLogger 类定义 ---
// 提供日志功能的单例类 (主要供内部实现使用)
// 这个类本身不再需要导出，但保留 MYLOGGER_API 以兼容旧用法或未来扩展
class MYLOGGER_API MyLogger
{
private:
	std::unique_ptr<MyLoggerImpl> pimpl; // 指向实现的指针 (Pimpl Idiom)
	bool loggingEnabled;                 // 日志总开关

	// 私有构造函数和删除的拷贝操作，强制单例模式
	MyLogger();
	MyLogger(const MyLogger&) = delete;
	MyLogger& operator=(const MyLogger&) = delete;

public:
	// 获取日志记录器的唯一实例
	static MyLogger& getInstance();

	// 析构函数 (在 cpp 中定义)
	~MyLogger();

	// 全局启用或禁用日志记录
	void setLoggingEnabled(bool enabled);

	// 检查日志记录当前是否已启用
	bool isLoggingEnabled() const;

	// --- 新增: 设置最大文件数的内部公共方法 ---
	// 这个方法由全局 C 风格 API MyLogger_SetMaxFiles 调用
	void setMaxFilesInternal(int count);

#ifdef QT_CORE_LIB
	// 绑定 QTextBrowser 控件以显示 Qt 日志
	void bindQtWidget(QTextBrowser* textBrowser);

	// 绑定 QTextEdit 控件以显示 Qt 日志
	void bindQtWidget(QTextEdit* textEdit);
#endif // QT_CORE_LIB

	// --- 内部日志记录方法 ---
	// 这些方法由 Internal_... C 风格 API 函数调用，接收预格式化的消息

	// 记录到文件/控制台接收器
	void log(LogLevel level, const char* file, int line, const char* function, const std::string& message);
	void info(const char* file, int line, const char* function, const std::string& message);
	void warn(const char* file, int line, const char* function, const std::string& message);
	void error(const char* file, int line, const char* function, const std::string& message);
	void critical(const char* file, int line, const char* function, const std::string& message);

#ifdef QT_CORE_LIB
	// 仅记录到 Qt 接收器
	void qt_log(LogLevel level, const char* file, int line, const char* function, const std::string& message);
	void qt_info(const char* file, int line, const char* function, const std::string& message);
	void qt_warn(const char* file, int line, const char* function, const std::string& message);
	void qt_error(const char* file, int line, const char* function, const std::string& message);
	void qt_critical(const char* file, int line, const char* function, const std::string& message);

	// 同时记录到文件/控制台和 Qt 接收器
	void both_log(LogLevel level, const char* file, int line, const char* function, const std::string& message);
	void both_info(const char* file, int line, const char* function, const std::string& message);
	void both_warn(const char* file, int line, const char* function, const std::string& message);
	void both_error(const char* file, int line, const char* function, const std::string& message);
	void both_critical(const char* file, int line, const char* function, const std::string& message);
#endif // QT_CORE_LIB

private:
	// Pimpl 实现细节隐藏在 .cpp 文件中
};

#endif // MYLOGGER_H